iT邦幫忙

0

iOS 人物去背

YC 2023-02-17 19:00:44857 瀏覽
  • 分享至 

  • xImage
  •  

Apple 在 CoreImage 裡提供了強大的 CIFilter 方便我們影像處理
前提是只能處理 CIImage,所以需要先將 Image 轉成 CIImage

convenience init?(named: String) {
    guard let image = UIImage(named: named)?.cgImage else {
        return nil
    }
    self.init(cgImage: image)
}

回到 CIFilter,
原本使用的方法: CIFilter(name: "CIBoxBlur"),太不Swifty了。
還好官方提供了另一種方法:只要 import CoreImage.CIFilterBuiltins 就能使用 CIFilter.boxBlur()

進入主題
人物去背,只要使用 CIFilter.personSegmentation() 就可以達到效果
以Jay為例
https://ithelp.ithome.com.tw/upload/images/20230217/20123457jDyQviZI7z.jpg

let input = CIImage(named: "Jay")!

let person = CIFilter.personSegmentation()
person.inputImage = input
person.qualityLevel = 1

就會得到遮照圖
https://ithelp.ithome.com.tw/upload/images/20230217/20123457Y2mktWt6eb.png

這時候只要讓原圖混上紅色遮照圖就完成了

let mask = CIFilter.blendWithRedMask()
mask.inputImage = input
mask.maskImage = person.outputImage

https://ithelp.ithome.com.tw/upload/images/20230217/20123457bHtGT2Wom4.png

/images/emoticon/emoticon04.gif等等,發生什麼事?
仔細看就會發現,person 和 input 的長寬比不一樣
所以需要做調整

extension CIImage {
    func scale(size: CGSize) -> CIImage {
        let x = size.width / self.extent.width
        let y = size.height / self.extent.height
        let transform = CGAffineTransform(scaleX: x, y: y)
        return  transformed(by: transform)
    }
}
mask.maskImage = person.outputImage!.scale(size: size)

https://ithelp.ithome.com.tw/upload/images/20230217/20123457CZCNrzTeVH.png


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言